package com.ccc.scala.base6_object

object Object09_Trait {
  def main(args: Array[String]): Unit = {
    // 面向对象 - 特征
    // Scala将多个类的相同特征从类中剥离出来，形成一个独立的语法结构，称之为“特质”（特征）。
    // 这种方式在Java中称之为接口，但是Scala中没有接口的概念。
    // 所以scala中没有interface关键字，而是采用特殊的关键字trait来声明特质,

    val cat = new Cat()
    cat.eat()
    cat.run()

    new Person() with Eat {  // 动态混入
      override def eat(): Unit = {
        println("Person eat...")
      }
    }


  }

  trait Eat {
    def eat(): Unit
  }

  trait Runnable {
    def run(): Unit
  }

  class Person extends Runnable {
    override def run(): Unit = {
      println("Person run...")
    }
  }

  // 一个类只有一个特征时，用 extends 关键字进行混入
  class Dog extends Runnable {
    override def run(): Unit = {
      println("Dog run...")
    }
  }

  // 一个类有多个特征，第一个用 extends ，后续采用with
  class Cat extends Runnable with Eat {
    override def run(): Unit = {
      println("Cat run...")
    }

    override def eat(): Unit = {
      println("Cat eat...")
    }
  }

  // 如果类存在父类的场合，并同时具备某个特征，
  // 需要使用extends关键字继承父类，使用with关键字混入特征
  class User extends Person with Runnable with Eat {
    override def eat(): Unit = {
      // ...
    }

    override def run(): Unit = {
      // ...
    }
  }

}
